# 从rest_framework模块中导入序列化器基类
from rest_framework import serializers

# 从book.models模块中导入User模型
from .models import Book, Article, Category


# 定义书籍序列化器类
class BookSerializer(serializers.ModelSerializer):
    # 添加一个额外只读字段
    user_name = serializers.SerializerMethodField()  # 声明为自定义方法字段
    category_name = serializers.CharField(source='category.name', read_only=True)
    # 封面图片URL字段
    cover_image_url = serializers.SerializerMethodField()

    def get_user_name(self, obj):
        # 通过 owning_profiles 获取第一个关联的 Profile
        owning_profile = obj.owning_profiles.first()
        if owning_profile:
            return owning_profile.user.username  # 返回关联用户的用户名
        return "未知作者"  # 默认值

    def get_cover_image_url(self, obj):
            if obj.cover_image:
                return self.context['request'].build_absolute_uri(obj.cover_image.url)
            return None

    def update(self, instance, validated_data):
        # 处理封面图片更新
        if 'cover_image' in validated_data:
            # 清除旧封面
            if instance.cover_image:
                instance.cover_image.delete(save=False)
        return super().update(instance, validated_data)

    def to_representation(self, instance):
        # 在响应中包含封面URL
        representation = super().to_representation(instance)
        representation['cover_image_url'] = self.get_cover_image_url(instance)
        return representation

    class Meta:
        # 指定序列化器所使用的模型
        model = Book
        # 指定需要序列化的字段为所有字段
        fields = '__all__'
        extra_kwargs = {
            'cover_image': {'write_only': True}  # 图片字段仅用于写入
        }


# 定义文章序列化器类
class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        # 指定序列化器所使用的模型
        model = Article
        # 指定需要序列化的字段为所有字段
        fields = '__all__'


class CategorySerializer(serializers.ModelSerializer):

    class Meta:
        model = Category
        fields = '__all__'
